<?

//! Classe principal, que gerencia o sistema
/*!
    O Controlador e chamado para tratar todo o sistema (o kernel do Sistema).
    Ele quem chama as operacoes corretas dos modulos necessarios.
*/
class Controlador
{

    //! Lista de modulos
    /*!
        Lista com todos os modulos cadastrados.
    */
    var $modulos = array();

    //! Objeto que gere a sessao
    /*!
        Este atributo e o tratador de sessao
    */
    var $sessao = null;

    //! Objeto que gere a Vis�o
    /*!
        Este atributo e o tratador da Visao (tarefa pertencente a qualquer projeto
        que siga o Design Pattern MVC).
    */
    var $tela = null;

    //! Construtor
    /*!
        Inicializa tela e sessao
    */
    function Controlador() {
		$this->tela = new Tela();
		$this->sessao = new Sessao();
	}

    //! Cadastra um modulo
    /*!
        Adiciona, em tempo de execucao, um modulo a lista de modulos ativos.
        \param $modulo Modulo a adicionar
    */
    function adicionarModulo($modulo)
    {
        array_push($this->modulos, $modulo);
    }

    //! � o "run()" desta classe.
    /*!
        Metodo principal, que dispara uma corrida por todos os modulos para ver
        qual deve ser executado.
        \param $post Variavel global $_POST passada por parametro
        \param $get Variavel global $_GET passada por parametro
    */
    function enviarTratamentoRequisicaoParaModulos($post, $get)
    {
        if ($this->sessao->existe() || ($post['evento'] == EVT_LOGIN)) {
            if(isset($post["evento"])) {          // TRATA TODOS OS EVENTOS POST
                $this->tratarEventosPost($post);
            } else if(isset($get["evento"])) {    // TRATA TODOS OS EVENTOS GET
                $this->tratarEventosGet($get);
            } else { 
                /*
                    JOGA PARA A TELA DE menu, CASO JA ESTEJA LOGADO e nenhum evento
                    foi enviado, como no caso de um reload
                */
                $this->tela->setPagina('inicio.html');
            }
        } else {
            $this->tela->setCampo('mensagem', 'Preencha as informacoes para entrar no sistema!');
            $this->tela->setPagina('modulos/login.html', FALSE);
        }
        $this->tela->mostrar();
    }

    //! Trata eventos mandado pelo metodo POST
    /*!
        Percorre todos os modulos e tenta tratar o evento de cada um deles, passando
        o c�digo do evento. Quando um assumir o codigo como sendo seu, tratando assim
        o evento, o ciclo termina (ou quando nao houver modulo para aquele evento).
        \param $post Variavel global $_POST passada por parametro
        \sa tratarEventosGet()
    */
    function tratarEventosPost($post)
    {
        foreach ($this->modulos as $moduloAtual) {
            if ($moduloAtual->tratarEventosPost($post['evento'], $this->tela,$post)) {
                return true;
            }
        }
        $this->mensagemEventoInexistente("POST", $post['evento']);
    }

    //! Trata eventos mandados pelo metodo GET
    /*!
        Percorre todos os modulos de maneira similar ao tratarEventosPost().
        \param $get Variavel global $_GET passada por parametro
        \sa tratarEventosPost()
    */
    function tratarEventosGet($get)
    {
        foreach ($this->modulos as $moduloAtual) {
            if ($moduloAtual->tratarEventosGet($get["evento"], $this->tela,$get)) {
                return true;
            }
        }
        $this->mensagemEventoInexistente("GET", $get["evento"]);
    }

    //! Mensagem padrao para evento inexistente
    /*!
        Este metodo e chamado sempre que ocorre de nenhum modulo se mostrar apto a
        tratar de um determinado evento.
        \param $tipoEvento Tipo de evento enviado: GET ou POST
        \param $codigo Codigo correspondente ao evento
    */
    function mensagemEventoInexistente($tipoEvento, $codigo)
    {
        $this->tela->setCampo('mensagemAusenciaEvento', 'Evento invalido enviado:' .
            $tipoEvento . '-' . $codigo);
        $this->tela->setPagina('inicio.html');
    }

}

?>
